package br.fafica.poo2.rightcode.disciplina;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.fafica.poo2.rightcode.Aplicacao;
import br.fafica.poo2.rightcode.aluno.Aluno;
import br.fafica.poo2.rightcode.exception.DisciplinaNaoEncontradaException;
import br.fafica.poo2.rightcode.exception.ListaDisciplinaVaziaException;
import br.fafica.poo2.rightcode.factory.ConnectionFactoryOracle;
import br.fafica.poo2.rightcode.usuario.Usuario;


public class RepositorioDisciplinaOracle implements IRepositorioDisciplina{
	
	private ConnectionFactoryOracle con;
	private Statement entrada;
	private static int increment;
	
	public RepositorioDisciplinaOracle(ConnectionFactoryOracle oracle) throws SQLException{
		this.con = oracle;
		increment = (getCodigoIncrement()+1);
	}
	
	private int getCodigoIncrement() throws SQLException{
		ArrayList<Disciplina> lista = null;
		Connection con=null;
		ResultSet resultado = null;
		Disciplina d;

		try {
			String sql1="select * from disciplina";
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery(sql1);
			
			lista= new ArrayList<Disciplina>();
		    while ( resultado.next() ) {
		    	d = new Disciplina(resultado.getInt("codigo_disciplina"),resultado.getString("nome_disciplina"),resultado.getString("descricao_disciplina"),resultado.getInt("codigo_usuario"));
		    	
		    	lista.add(d);
		    }
		    con.commit();
			con.setAutoCommit(true);
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		
		return lista.size();
		
	}

	@Override
	public void TesteDisciplina() throws SQLException {
		Connection con=null;
		//try {
			con = this.con.getConexao();
			System.out.println("Conexão aberta. testes temporario");//Excluir esse testes depois pois a exibi��o n�o pode ser aqui
			
		//} catch (SQLException e) {
		//	throw new SQLException();
		//}finally{
			con.close();
		//}
	}

	@Override
	public void InstalarDisciplina(boolean samples) throws SQLException {
			Connection con = null;
			
			    String sql1 = "create table disciplina" +
		                   "(codigo_disciplina number(5) primary key ," +
		                   "nome_disciplina varchar2(50) not null," +
		                   "descricao_disciplina varchar2(100),"
		                   + "codigo_usuario number(5),"
		                   + "foreign key(codigo_usuario) references usuario(codigo_usuario) on delete cascade)";
			    
			    /*String sql2 = "create table disciplina_possue_alunos"
			    		+ "(codigo_disciplina number(5) not null,"
			    		+ "codigo_aluno number(5) not null,"
			    		+ "primary key(codigo_disciplina, codigo_aluno),"
			    		+ "foreign key(codigo_disciplina) references disciplina(codigo_disciplina),"
			    		+ "foreign key(codigo_aluno) references aluno(codigo_aluno))";*/
			    try{
					con = this.con.getConexao();
					entrada = con.createStatement();
				    entrada.execute(sql1);
				    System.out.println("Tabela Disciplina Criada");
				    
				   /* con = this.con.getConexao();
					entrada = con.createStatement();
				    entrada.execute(sql2);
				    System.out.println("Tabela disciplina_possue_alunos Criada");*/
				    
				    entrada.close();
					con.commit();
					con.setAutoCommit(true);
				    con.close();
					
			    }catch(Exception e) {
			    	con.rollback();
			    }
			if(samples){
				Aplicacao app = new Aplicacao();
				for(Disciplina d: app.getDisciplina()){
					AdicionarDisciplina(d);
				}
			}
		
	}

	@Override
	public void AdicionarDisciplina(Disciplina disciplina) throws SQLException {
		Connection con = null;

		try {
			con = this.con.getConexao();
		    String sql = "insert into disciplina (codigo_disciplina, nome_disciplina, descricao_disciplina, codigo_usuario) values (" +
		                   disciplina.getCodigo() + ", " +
		                   "'" + disciplina.getNome()+"','"+ disciplina.getDescricao() +"',"+ disciplina.getCodigo_usuario() +")"; 
			entrada = con.createStatement();
			entrada.executeUpdate(sql);
			con.commit();
			con.setAutoCommit(true);
			
			//Adicionando na relação disciplina_possuem_alunos
			/*if(!disciplina.getAlunos().isEmpty()){
				for(Aluno a : disciplina.getAlunos()){
					setDisciplinaPossueAlunos(disciplina.getCodigo(),a);
				}
			}*/
			
			System.out.println("Aluno inserido na tabela"); // linha Temporaria
		}catch(Exception e){
			con.rollback();	
		}finally {
			entrada.close();
			con.close();
		}
		
	}

	/*private void setDisciplinaPossueAlunos(int codigo_disciplina, Aluno aluno) throws SQLException {
		Connection con = null;
		try {
			con = this.con.getConexao();
		    String sql = "insert into disciplina_possue_alunos (codigo_disciplina, codigo_aluno) values (" +
		    				codigo_disciplina+ ", " +
		                   aluno.getCodigo()+")"; 
			entrada = con.createStatement();
			entrada.executeUpdate(sql);
			System.out.println("disciplina_possue_alunos inserido na tabela"); // linha Temporaria
		} finally {
			entrada.close();
			con.close();
		}
	}*/

	@Override
	public void RemoverDisciplina(Disciplina disciplina) throws SQLException,DisciplinaNaoEncontradaException {
		Connection con=null;

		try {
			con = this.con.getConexao();
		    String sql = "delete from disciplina where codigo_disciplina=" +
		                   disciplina.getCodigo();
		    //LEMBRETE.: Verificar alguma maneira para se deletar o usuario deletado da tabela disciplina_possue_alunos
			entrada = con.createStatement();
			entrada.executeUpdate(sql);
			con.commit();
			con.setAutoCommit(true);
		}catch(Exception e){
			con.rollback();	
		}finally{
			entrada.close();
			con.close();
		}
		
	}

	@Override
	public Disciplina BuscarDisciplina(int codigo) throws SQLException, DisciplinaNaoEncontradaException {
		Connection con=null;
		ResultSet resultado = null;
		Disciplina d=null;
		con.setAutoCommit(false);
		try {
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery( "select * from disciplina where codigo_disciplina=" + codigo);
			//LEMBRETE. Organizar para retornar os usuarios tambem
		    while ( resultado.next() ) {
		    	d = new Disciplina(resultado.getInt("codigo_disciplina"),resultado.getString("nome_disciplina"),resultado.getString("descricao_disciplina"),resultado.getInt("codigo_usuario"));
		    }
		    con.commit();
			con.setAutoCommit(true);
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		if(d==null){
			throw new DisciplinaNaoEncontradaException();
		}else{
			return d;
		}
	}

	@Override
	public ArrayList<Disciplina> ListaDisciplina() throws ListaDisciplinaVaziaException, SQLException {
		ArrayList<Disciplina> lista = null;
		Connection con=null;
		ResultSet resultado = null;
		Disciplina d;

		try {
			String sql1="select * from disciplina";
			con = this.con.getConexao();
			con.setAutoCommit(false);
			entrada = con.createStatement();
			
			resultado = entrada.executeQuery(sql1);
			
			lista= new ArrayList<Disciplina>();
		    while ( resultado.next() ) {
		    	d = new Disciplina(resultado.getInt("codigo_disciplina"),resultado.getString("nome_disciplina"),resultado.getString("descricao_disciplina"),resultado.getInt("codigo_usuario"));
		    	
		    	lista.add(d);
		    }
		    con.commit();
			con.setAutoCommit(true);
		}catch(Exception e){
			con.rollback();	
		}finally{
			resultado.close();
			entrada.close();
			con.close();
		}
		if(lista.isEmpty()){
			throw new ListaDisciplinaVaziaException();
		}else{
			return lista;
		}
	}

	@Override
	public void EditarDisciplinas(Disciplina disciplina)
			throws DisciplinaNaoEncontradaException, SQLException {
				Connection con=null;

				try {
					con = this.con.getConexao();
					con.setAutoCommit(false);
					entrada = con.createStatement();

				    String sql = "update disciplina SET " +
				    				"nome_disciplina='" + disciplina.getNome() + "'," +
				    				"descricao_disciplina='" + disciplina.getDescricao() + "',"+
				    				"codigo_usuario='" + disciplina.getCodigo_usuario() + "'"+
				    				"WHERE codigo_disciplina=" + disciplina.getCodigo(); 
					entrada.executeUpdate(sql);
					con.commit();
					con.setAutoCommit(true);
				}catch(Exception e){
					con.rollback();	
				}finally{
					entrada.close();
					con.close();
				}
	}
	
	
	
	
	
/*	Connection conexao = new Conexao().getConexao();

	@Override
	public void TesteDisciplina() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void InstalarDisciplina(boolean samples) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void AdicionarDisciplina(Disciplina disciplina) {
		String sql = "insert into Disciplina"
				+"(nome,descricao)"
				+"values(?,?)";
		try{
			PreparedStatement stmp = conexao.prepareStatement(sql);
			stmp.setString(1, disciplina.getNome());
			
			stmp.execute();
			stmp.close();
			
			
		}catch(SQLException e){
			e.printStackTrace();
		}	
		
	}

	@Override
	public ArrayList<Disciplina> ListaDisciplina() {
		String sql = "select * from Disciplina";
		
		try{
			PreparedStatement stmp = conexao.prepareStatement(sql);
			ResultSet resultado = stmp.executeQuery();
			
			ArrayList<Disciplina> lista = new ArrayList<Disciplina>();
			while(resultado.next()){
				Disciplina disciplina = new Disciplina();
				disciplina.setNome(resultado.getString("nome"));
				
				lista.add(disciplina);				
			}
			resultado.close();
			stmp.close();
			return lista;
		}catch(SQLException e){
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public void RemoverDisciplina(Disciplina disciplina) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Disciplina BuscarDisciplina(int codigo) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void EditarDisciplinas(Disciplina disciplina)
			throws DisciplinaNaoEncontrada {
		// TODO Auto-generated method stub
		
	}*/

}
